<?php
/**
 * Controller_Base
 *
 * Класс Controller_Base отвечает за базовую работу всех контроллеров
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
header('Content-Type: text/html; charset=UTF-8');
abstract class Controller_Base {
	// Стандартные атрибуты. Используются во все проектах
  protected $showAnalytics = true; // Флаг, выводить или нет код гугл-аналитикс
  protected $title = ''; // Мета-тайтл страницы
	protected $pageHead = ''; // Главный заголовок страницы
	protected $bodyAttrs = ''; // атрибуты тега body
	protected $keywords = null; // мета-ключевые слова
	protected $description = null; // мета-описание
	protected $arrCss = array('main.css', 'design.css', 'pop_up_box.css', 'forms.css'); //список подключаемых css-файлов, 'unitpngfix.js',
	protected $arrJs = array('config.js', 'service_functions.js', 'jquery-1.4.2.min.js', 'JSON2.min.js', 'all.js', 'main.js', 'jquery.timers.js', 'pop_up_box.js', 'css2.js'); // список подключаемых js-файлов
	protected $arrRequest = array(); // Массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	protected $jsReady; // JS-код, который будет автоматически вызван при загрузке страницы
	protected $arrAdditional = array(/*'<script src="http://connect.facebook.net/en_US/all.js"></script>'*/); // в этом массив можно вносить строки любых мета-тегов. Он будет выведен внутри элемента haed
	protected $showUserMessagesInStandardPlace = true; // Флаг, определяющий выводить ли системные сообщения о выполнении действий пользователю в стандартном месте
	protected $showCrumbsInStandardPlace = false; // Флаг, определяющий, выводить ли хлебные крошки в стандартном месте
	protected $arrUserVars = array(); // Хранилище для пользовательских переменных. Например, для флагов свернуто/развернуто
  protected $showLeftColumn = false; // Флаг, указывающий, нужно ли выводить левую колонку
  protected $showRightColumn = true; // Флаг, указывающий, нужно ли выводить левую колонку
  protected $arrCrumbs = array(array('url' => W_ABSPATH, 'name' => 'Home page'));
  // Атрибуты, связанные с постраничным выводом
  protected $pageLimit = 20;            // кол-во элементов на страницу
  protected $pageNum = 1;               // текущая страница
  protected $elementsInListAmount = 0;  // Количество элементов в списке для постраничного вывода
  protected $pageUrlsInGet = true;      // Номер страницы передавать в GET
  protected $isPageInUrl = false;       // Номер страницы уже фигурирует в URL. Требуется только тогда, когда $pageUrlsInGet == false
  protected $editUrl = null;            // Ссылка на редактирование. Если ее задать в заголовке автоматически появится "ред."
  protected $mainActionHtml = null;     // HTML код основной ссылки - будут вставляться в div с float right в основном заголовке


	// Дополнительные атрибуты конкретного проекта


	/**
	 * Конструктор контроллера
	 *
	 * @param array $arrRequest - массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	 */
	public function __construct(&$arrRequest) {
		$this->arrRequest = &$arrRequest;
		$this->addMetasForLogInCheck();
		$arrVarName = array('root_answer_form');
  	$this->arrUserVars = User_Variable::getVariableValue(User_User::getId(), $arrVarName, true);
  	if (!((isset($arrRequest[1]) && $arrRequest[1] == 'order') ||(isset($arrRequest[3]) && $arrRequest[3] == 'order'))) $this->addJs('unitpngfix.js');
	}


	/**
	 * Метод выводит метаданные
	 *
	 */
	public function showMetas() {
		echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
		echo '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">';
		echo '<head>';
	  	echo '<title>' . $this->title . '</title>';

	  	echo '<meta http-equiv="content-language" content="eng" />';
	  	echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />';
	  	echo '<meta name="author" content="Kouzma" />';
	  	echo '<meta name="w1-verification" content="187754523111" />'; // для Единого кошелька 

	  	//echo '<meta name="google-site-verification" content="3BlUJojgom27yHnFJJxPbCBq03ANr5v0WtcdR9QF6hg"/>';
	  	//echo '<link rel="shortcut icon" href="' . W_IMAGES . 'favicon.ico" type="image/x-icon" />';

	  	
	  	if (isset($this->keywords))	echo '<meta name="keywords" content="' . $this->keywords . '" />';
	  	if (isset($this->description)) echo '<meta name="description" content="' . $this->description . '" />';
	  	foreach ($this->arrCss as $cssFile)	echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . $cssFile . '" />';
	    foreach ($this->arrJs as $jsFile) echo '<script type="text/javascript" src="' . W_JS . $jsFile . '"></script>';
			foreach ($this->arrAdditional as $additional)	echo $additional;
			if (isset($this->jsReady)) {
				echo '<script type="text/javascript">';
					echo '$().ready(function() {';
						echo $this->jsReady;
					echo '});';
				echo '</script>';
			}
      echo '<!--[if lt IE 7]>';
        echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . 'ie_6.css" />';
      echo '<![endif]-->';
      echo '<!--[if lt IE 8]>';
        echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . 'ie_7.css" />';
      echo '<![endif]-->';
      echo '<!--[if lt IE 9]>';
        echo '<link rel="stylesheet" type="text/css" href="' . W_CSS . 'ie_8.css" />';
      echo '<![endif]-->';

		echo '</head>';
		echo '<body ' . $this->bodyAttrs . '>';
		echo '<div id="all"><div id="allIn">';
	}

  /**
   * Метод добавляет css файл к общему массиву
   *
   * @param string $cssFileName
   */
	public function addCss($cssFileName) {
  	$this->arrCss[] = $cssFileName;
  }
  /**
   * Метод добавляет js файл к общему массиву
   *
   * @param string $jsFileName
   */
	public function addJs($jsFileName) {
  	$this->arrJs[] = $jsFileName;
  }
  /**
   * Метод добавляет очередную хлебную крошки к общему массиву
   *
   * @param string $arrCrumb
   */
	public function addCrumb($name, $url = null, $noLinkIfLast = false) {
  	$arrCrumb = array();
  	$arrCrumb['name'] = $name;
  	$arrCrumb['url'] = $url;
  	$arrCrumb['no_link_if_last'] = $noLinkIfLast;
	  $this->arrCrumbs[] = $arrCrumb;
  }
  /**
   * Метод устанавливает хлебные крошки
   *
   * @param string $arrCrumbs
   */
	public function setCrumbs($arrCrumbs) {
  	$this->arrCrumbs = $arrCrumbs;
  }
  /**
   * Метод добавляет доплнительный код в метатеги
   *
   * @param string $additional
   */
	public function addAdditional($additional) {
  	$this->arrAdditional[] = $additional;
  }
  /**
   * Метод задает js код, который будет выполняться при загрузке страницы
   *
   * @param string $jsReadyText
   */
	public function setJsReady($jsReadyText) {
  	$this->jsReady = $jsReadyText;
  }
  /**
   * Метод добавляет js код, который будет выполняться при загрузке страницы
   *
   * @param string $jsReadyText
   */
	public function addJsReady($jsReadyText) {
  	if (!isset($this->jsReady))
  		$this->jsReady = $jsReadyText;
  else
    $this->jsReady .= $jsReadyText;
  }
  
  /**
   * Метод добавляет js для работы Datepickers
   *
   */
  public function initFormsDatepickers() {
    $this->arrJs[] = 'main.js';
  }  

  /**
   * Метод добавляет js и css файлы для работы редактора WYSIWYG
   *
   */
	public function addWysiwygMetas() {
		$this->arrJs[] = 'thickbox.js';
		$this->arrJs[] = 'jquery.ocupload-1.1.2.js';
		$this->arrJs[] = 'jquery.wysiwyg.js';
		$this->arrCss[] = 'jquery.wysiwyg.css';
		$this->arrCss[] = 'thickbox.css';
  }


  /**
   * Метод закрывает html-код
   *
   */
	public function showClose() {
	  if ($this->showAnalytics) {

    }
		echo '</body>';
		echo '</html>';
	}


	/**
	 * Выводит шапку
	 *
	 */
	public function showHeader() {
  	$this->showMetas();    // вывод метатегов
		$this->showTop();      // вывод верхней части
		//$this->showUserMenu(); // вывод пользовательского меню

		// Вывод боковых столбцов и
		if ($this->showLeftColumn) $this->showLeft();
		if ($this->showRightColumn) $this->showRight();

		// Вывод основного дива в зависимости от наличия боковых столбцов
		if ($this->showLeftColumn && $this->showRightColumn) echo '<div id="main">';
		elseif (!$this->showLeftColumn && $this->showRightColumn) echo '<div id="mainWithLeft">';
		elseif ($this->showLeftColumn && !$this->showRightColumn) echo '<div id="mainWithRight">';
		else echo '<div id="mainFullWidth">';

		// Вывод хлебных крошек
		if ($this->showCrumbsInStandardPlace) {
		  $this->showCrumbs();
		}

		// вывод основного заголовка
		if ($this->pageHead != '') {
      $this->showH1($this->pageHead);
		}

		// вывод сообщения об ошибке
		if ($this->showUserMessagesInStandardPlace) {
			if (User_Flash::_get('successMessage')) View_User::showUserMessage(User_Flash::_get('successMessage'), 1);
			if (User_Flash::_get('errorMessage')) View_User::showUserMessage(User_Flash::_get('errorMessage'), -1);
		}
  }

  /**
   * Метод выводит стандартный заголовок
   *
   * @param string $pageHead
   * @param string $editUrl
   */
  public function showH1($pageHead = null, $editUrl = null) {
	  if(empty($pageHead)) $pageHead = $this->pageHead;
	  if(empty($editUrl)) $editUrl = $this->editUrl;
    if ($this->mainActionHtml) echo '<div id="mainPageAction">' . $this->mainActionHtml . '</div>';
	  echo '<h1 id="mainH1">';
	    echo $pageHead;
	    if (!empty($editUrl)) echo ' (<a href="' . $editUrl . '">edit</a>)';
	  echo '</h1>';
  }

  /**
   * Выводит подвал
   *
   */
  public function showFooter() {
   		echo '</div>'; // Закрываем основной контентный див (#mainFullWidth)
      echo '<div class="clear"></div>';
      echo '<div id="mainDivMarginBottom"></div>';
    echo '</div></div>'; // закрываем див всего сайта #all и #allIn
  	$this->showBasement();
  	$this->showClose();
  }
  /**
   * Выводит верхнюю часть
   *
   */
  public function showTop() {
	  echo '<div id="top"><div id="leftTop">';
      View_Block::showTopBlock();
	  echo '</div></div>';
  }

  /**
   * Метод выводит хлебные крошки
   *
   */
  public function showCrumbs() {
    $crumbsSize = sizeof($this->arrCrumbs);
    if ($crumbsSize) echo '<div id="crumbs">';
    for ( $i = 0; $i < $crumbsSize; $i++) {
      if (isset($this->arrCrumbs[$i]['url']) && $_SERVER['REQUEST_URI'] != $this->arrCrumbs[$i]['url'] && (!isset($this->arrCrumbs[$i]['no_link_if_last']) || !$this->arrCrumbs[$i]['no_link_if_last'])) {
        echo '<a href="' . $this->arrCrumbs[$i]['url'] . '">';
      }
  	  echo $this->arrCrumbs[$i]['name'];
      if (isset($this->arrCrumbs[$i]['url']) && $_SERVER['REQUEST_URI'] != $this->arrCrumbs[$i]['url'] && (!isset($this->arrCrumbs[$i]['no_link_if_last']) || !$this->arrCrumbs[$i]['no_link_if_last'])) {
        echo '</a>';
      }
      if ($i < $crumbsSize - 1) echo '<img src="' . W_IMAGES . 'icons/separator/arrow.gif" class="arrowSeparator" alt="" />';
  	}
  	if ($crumbsSize) echo '</div>';
  }


  /**
   * Выводит нижнюю часть
   *
   */
  public function showBasement() {
  	echo '<div id="basementOut"><div class="all"><div class="allIn"><div id="basement">';
      View_Block::showBasement();
  	echo '</div></div></div></div>';
  }

  /**
   * Выводит левую часть
   *
   */
  public function showLeft() {
  	echo '<div id="left">';
      echo 'Left column';
  	echo '</div>';
  }

  /**
   * Выводит правую часть
   *
   */
  public function showRight() {
  	echo '<div id="right">';
  	$objSession = User_Session::instance();
  	if ($objSession->isLoggedIn()) {
  	  $this->showLogInBlock = false;
  	  View_Block::showUserMenu();
  	}  	
  	else {
  	  View_Block::showLogInBlock();
  	}
  	  echo '<br/>';
  	  View_Block::showStatBlock();
  	echo '</div>';
  }

	/**
	 * Метод выводит сообщение о 404 ошибке
	 *
	 */
	public function show404Error() {
		$this->title = 'Sorry, this page does not exist.';
		$this->pageHead = 'Sorry, this page does not exist.';
    $this->showHeader();
		$this->showFooter();
	}

	/**
	 * Метод выводит сообщение о 404 ошибке
	 *
	 */
	public function show403Error() {
		$this->showRightColumn = false;
	  $this->showLeftColumn = false;
		$this->title = 'Sorry, this page is restricted.';
		$this->pageHead = 'Sorry, this page is restricted.';
    $this->showHeader();
		$this->showFooter();
	}
	/**
	 * Метод выводит блок постраничного листания
	 */
	public function showPages() {
    $urlBeforePageNummber = W_ABSPATH;
    $urlAfterPageNummber = '';
    //Формируем основной URL (то, что до символа "?")
    if (!empty($this->arrRequest)) foreach ($this->arrRequest as $urlWord) {
    	if (!empty($urlWord)) $urlBeforePageNummber .= $urlWord . '/';
    }

    if (!$this->pageUrlsInGet) { //Если номер страницы нужно передавать не через "?", а через /123/
      $urlAfterPageNummber = '/';
      if (!empty($_SERVER['QUERY_STRING'])) {
        $urlAfterPageNummber .= '?' . $_SERVER['QUERY_STRING'];
      }
      if ($this->isPageInUrl) {
        $urlBeforePageNummber = substr($urlBeforePageNummber, 0, strlen($urlBeforePageNummber) - 1);
        $urlBeforePageNummber = substr($urlBeforePageNummber, 0, strrpos($urlBeforePageNummber, '/') + 1);
      }
    }
    else { // Если номер страницы нужно передавать в GET, через "?"
      $urlBeforePageNummber .= '?';
      if (strpos($_SERVER['QUERY_STRING'], 'p=') === 0) { // Если среди GET параметров в самом начале стоит p=
        $urlBeforePageNummber .= 'p=';
        if (strpos($_SERVER['QUERY_STRING'], '&', 2)) $urlAfterPageNummber = substr($_SERVER['QUERY_STRING'], strpos($_SERVER['QUERY_STRING'], '&', 2));
      }
      else { // Если в начале GET параметров не стоит p=
        $pagePosInGet = strpos($_SERVER['QUERY_STRING'], '&p=');
        if ($pagePosInGet === false) { // Если в GET параметрах вообще отсутствует "p="
          $urlBeforePageNummber .= 'p=';
          $urlAfterPageNummber = '&' . $_SERVER['QUERY_STRING'];
        }
        else { // Если в GET параметрах  "p=" стоит в середине или конце
          $urlBeforePageNummber .= substr($_SERVER['QUERY_STRING'], 0, $pagePosInGet + 3);
          if (strpos($_SERVER['QUERY_STRING'], '&', $pagePosInGet + 1)) $urlAfterPageNummber = substr($_SERVER['QUERY_STRING'], strpos($_SERVER['QUERY_STRING'], '&', $pagePosInGet + 1));
        }
      }
    }

    $pagesAmount = ceil($this->elementsInListAmount / $this->pageLimit);
    View_Pager::getPages($urlBeforePageNummber , $pagesAmount, $this->pageNum, '', $urlAfterPageNummber, $this->elementsInListAmount);
	}


	/**
	 * Метод проверяет авторизацию пользователя и передает в js функцию
	 *
	 */
	public function addMetasForLogInCheck() {
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if ($userId) $loggedIn = 1;
		else $loggedIn = 0;
		$this->addJsReady('user.logInCheck({"loggedIn": ' . $loggedIn . '});');
	}



  /**
   * Формирует url без GET параметров
   *
   * @return string
   */
  public function getCurrentUrl() {
    $urlBeforePageNummber = W_ABSPATH;
    //Формируем основной URL (то, что до символа "?")
    if (!empty($this->arrRequest)) foreach ($this->arrRequest as $urlWord) {
    	if (!empty($urlWord)) $urlBeforePageNummber .= $urlWord . '/';
    }
    return $urlBeforePageNummber;
  }
  
  public function addDatepickerMetas() {
	  $this->AddCss('ui.datepicker.css');
    $this->AddCss('ui.core.css');
    $this->AddCss('jquery-ui-1.8.4.custom.css');
    $this->AddJs('ui.datepicker.js');
    $this->AddJs('ui.core.js');
  }

}
?>